#include "misc_tool.h"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 

namespace xos
{
    namespace misc_tool
    {
        // 
        // utf8 to wchar
        // 
        int utf8_to_wchar( const char * lpszSrc, int nSrcByteSize, wchar_t * lpszDest, int nDestByteSize, int * lpnDestNeedSize )
        {
            int nRet = 0;

            int need_size = 0;

            if( !lpszSrc || !lpszDest )
            {
                nRet = 1;
            }

            if( 0 == nRet )
            {
                need_size = MultiByteToWideChar( CP_UTF8, 0, lpszSrc, nSrcByteSize, 0, 0 );

                if( 0 == need_size )
                {
                    nRet = 1;
                }
            }

            if( 0 == nRet )
            {
                if( lpnDestNeedSize )
                {
                    *lpnDestNeedSize = need_size;
                }

                if( nDestByteSize < need_size )
                {
                    nRet = 1;
                }
            }

            if( 0 == nRet )
            {
                int ret = MultiByteToWideChar( CP_UTF8, 0, lpszSrc, nSrcByteSize, lpszDest, nDestByteSize );

                if( 0 == ret )
                {
                    nRet = 1;
                }
            }

            return nRet;
        }

        // 
        // wcharto utf8
        // 
        int wchar_to_utf8( const wchar_t * lpszSrc, int nSrcByteSize, char * lpszDest, int nDestByteSize, int * lpnDestNeedSize )
        {
            int nRet = 0;

            int need_size = 0;

            if( !lpszSrc || !lpszDest )
            {
                nRet = 1;
            }

            if( 0 == nRet )
            {
                need_size = WideCharToMultiByte( CP_UTF8, 0, lpszSrc, nSrcByteSize, 0, 0, 0, 0 );

                if( 0 == need_size )
                {
                    nRet = 1;
                }
            }

            if( 0 == nRet )
            {
                if( lpnDestNeedSize )
                {
                    *lpnDestNeedSize = need_size;
                }

                if( nDestByteSize < need_size )
                {
                    nRet = 1;
                }
            }

            if( 0 == nRet )
            {
                int ret = WideCharToMultiByte( CP_UTF8, 0, lpszSrc, nSrcByteSize, lpszDest, nDestByteSize, 0, 0 );

                if( 0 == ret )
                {
                    nRet = 1;
                }
            }

            return nRet;
        }
    } // misc_tool
} // xos
